using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;

namespace BLF.WWW_WWW.Wiki
{

	/// <summary>
	/// Allows to compress and decompress byte streams in memory.
	/// </summary>
	public static class Compressor {

		/// <summary>
		/// Compresses data.
		/// </summary>
		/// <param name="data">The data to compress.</param>
		/// <returns>The compressed data.</returns>
		public static byte[] Compress(byte[] data) {
			MemoryStream output = new MemoryStream();
			GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
			gzip.Write(data, 0, data.Length);
			gzip.Close();
			return output.ToArray();
		}

		/// <summary>
		/// Decompresses data.
		/// </summary>
		/// <param name="data">The data to decompress.</param>
		/// <returns>The decompressed data.</returns>
		public static byte[] Decompress(byte[] data) {
			MemoryStream input = new MemoryStream();
			input.Write(data, 0, data.Length);
			input.Position = 0;
			GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);
			MemoryStream output = new MemoryStream();
			byte[] buff = new byte[64];
			int read = -1;
			read = gzip.Read(buff, 0, buff.Length);
			while(read > 0) {
				output.Write(buff, 0, read);
				read = gzip.Read(buff, 0, buff.Length);
			}
			gzip.Close();
			return output.ToArray();
		}

	}

}
